package br.com.damazzy.negocio.persistencia.dao;

import java.io.Serializable;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import br.com.damazzy.conexao.Conexao;
import br.com.damazzy.negocio.entidade.Funcionalidade;

public class FuncionalidadeDaoImpl implements FuncionalidadeDao {
	
	public Funcionalidade alterar(Funcionalidade objeto) throws Exception {
		
		Connection conn = null;
		PreparedStatement ps = null;
		int cont = 1;
		
		try {
			conn = Conexao.criarConexao();
			
			StringBuffer sql = new StringBuffer();
			sql.append("update damazzy.funcionalidade set nomefuncionalidade = ?, descfuncionalidade = ? where idfuncionalidade = ?");
			
			ps = conn.prepareStatement(sql.toString());
			
			ps.setString(cont++, objeto.getNomeFuncionalidade());
			ps.setString(cont++, objeto.getDescFuncionalidade());
			ps.setInt(cont++, objeto.getIdFuncionalidade());
			
			ps.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Erro ao alterar a funcionalidade.");
		} finally {
			Conexao.fecharConexao(conn);
		}
		
		return this.obter(objeto.getIdFuncionalidade());
	}

	public void excluir(Serializable chave) throws Exception {
		
		Connection conn = null;
		PreparedStatement ps = null;
		
		try {
			conn = Conexao.criarConexao();
			
			StringBuffer sql = new StringBuffer();
			sql.append("delete from damazzy.funcionalidade where idfuncionalidade = ?");
			
			ps = conn.prepareStatement(sql.toString());
			
			Integer id = (Integer) chave;
			ps.setLong(1, id);
			
			ps.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Erro ao excluir a funcionalidade.");
		} finally {
			Conexao.fecharConexao(conn);
		}
	}

	public Funcionalidade incluir(Funcionalidade objeto) throws Exception {

		Connection conn = null;
		PreparedStatement ps = null;
		int cont = 1;
		
		try {
			conn = Conexao.criarConexao();
			
			StringBuffer sql = new StringBuffer();
			sql.append("insert into damazzy.funcionalidade (nomefuncionalidade, descfuncionalidade) values (?, ?)");
			
			ps = conn.prepareStatement(sql.toString());
			ps.setString(cont++, objeto.getNomeFuncionalidade());
			ps.setString(cont++, objeto.getDescFuncionalidade());
			
			ps.executeUpdate();
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Erro ao incluir a funcionalidade.");
		} finally {
			Conexao.fecharConexao(conn);
		}
		
		return null;
	}

	public List<Funcionalidade> listar() throws Exception {
		return this.pesquisar(new Funcionalidade());
	}

	public Funcionalidade obter(Serializable chave) throws Exception {
		
		Funcionalidade funcionalidade = null;
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		
		try {
			conn = Conexao.criarConexao();
			
			StringBuffer sql = new StringBuffer();
			sql.append("select * from damazzy.funcionalidade where idfuncionalidade = ?");
			
			ps = conn.prepareStatement(sql.toString());
			
			Long id = (Long) chave;
			ps.setLong(1, id);
			
			rs = ps.executeQuery();
			
			if (rs.next()) {
				funcionalidade = new Funcionalidade();
				
				funcionalidade.setIdFuncionalidade(rs.getInt("idfuncionalidade"));
				funcionalidade.setDescFuncionalidade(rs.getString("descfuncionalidade"));
				funcionalidade.setNomeFuncionalidade(rs.getString("nomefuncionalidade"));
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Erro ao obter a funcionalidade.");
		} finally {
			Conexao.fecharConexao(conn);
		}
		
		return funcionalidade;
	}

	public List<Funcionalidade> pesquisar(Funcionalidade objeto) throws Exception {
		
		Funcionalidade funcionalidadeFiltro = objeto;
		Funcionalidade funcionalidade;
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		List<Funcionalidade> funcionalidades = new ArrayList<Funcionalidade>();
		
		try {
			conn = Conexao.criarConexao();
			
			StringBuffer sql = new StringBuffer();
			sql.append("select * from damazzy.funcionalidade where 1 = 1 ");
			
			if (funcionalidadeFiltro.getIdFuncionalidade() != null) {
				sql.append("and p.idfuncionalidade = " + funcionalidadeFiltro.getIdFuncionalidade());
			}
			
			if (funcionalidadeFiltro.getNomeFuncionalidade() != null) {
				sql.append("and p.nomefuncionalidade like '%" + funcionalidadeFiltro.getNomeFuncionalidade() + "%'");
			}
			
			if (funcionalidadeFiltro.getDescFuncionalidade() != null) {
				sql.append("and p.descfuncionalidade like '%" + funcionalidadeFiltro.getDescFuncionalidade() + "%'");
			}
			
			ps = conn.prepareStatement(sql.toString());
			rs = ps.executeQuery();
			
			while (rs.next()) {
				funcionalidade = new Funcionalidade();
				
				funcionalidade.setIdFuncionalidade(rs.getInt("idfuncionalidade"));
				funcionalidade.setNomeFuncionalidade(rs.getString("nomefuncionalidade"));
				funcionalidade.setDescFuncionalidade(rs.getString("descfuncionalidade"));
				
				funcionalidades.add(funcionalidade);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Erro ao pesquisar a funcionalidade.");
		} finally {
			Conexao.fecharConexao(conn);
		}
		
		return funcionalidades;
	}
}
